Spring Security-এর মূল অংশ হলো HTTP স্তরে নিরাপত্তা নিশ্চিত করা। এই ক্ষেত্রে HttpSecurity এবং WebSecurityConfigurerAdapter ব্যবহৃত হয়।
WebSecurityConfigurerAdapter
Spring Security-তে WebSecurityConfigurerAdapter ছিল একটি প্রধান ক্লাস যা কাস্টম সিকিউরিটি কনফিগারেশন তৈরির জন্য ব্যবহৃত হত। তবে, Spring Security 5.7.0 থেকে WebSecurityConfigurerAdapter ডিপ্রিকেটেড হয়েছে। এর পরিবর্তে, এখন SecurityFilterChain ব্যবহার করা হয়।
যদিও WebSecurityConfigurerAdapter পুরোনো, এটি এখনও অনেক প্রকল্পে ব্যবহৃত হয়। এখানে আমরা WebSecurityConfigurerAdapter এবং এর আধুনিক বিকল্প HttpSecurity নিয়ে আলোচনা করব।
WebSecurityConfigurerAdapter ব্যবহার (Deprecated)
১. Maven Dependency যোগ করা
Spring Security ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. WebSecurityConfigurerAdapter ক্লাস তৈরি
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public/**").permitAll() // Public endpoints
.antMatchers("/admin/**").hasRole("ADMIN") // Admin role only
.anyRequest().authenticated() // All other requests
.and()
.formLogin()
.loginPage("/login").permitAll() // Custom login page
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}admin123") // {noop} indicates no password encoding
.roles("ADMIN")
.and()
.withUser("user")
.password("{noop}user123")
.roles("USER");
}
}
HttpSecurity ব্যবহার (Modern Approach)
Spring Security 5.7.0 থেকে SecurityFilterChain ব্যবহার করার পরামর্শ দেওয়া হয়। নিচে HttpSecurity এর আধুনিক ব্যবহার দেখানো হলো।
১. Maven Dependency যোগ করা
Spring Security এর ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
২. SecurityFilterChain এবং HttpSecurity ব্যবহার
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // Public endpoints
.requestMatchers("/admin/**").hasRole("ADMIN") // Admin role only
.anyRequest().authenticated() // All other requests
)
.formLogin(form -> form
.loginPage("/login") // Custom login page
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
৩. In-Memory Authentication ব্যবহার
Spring Boot অ্যাপ্লিকেশন চালানোর সময় In-Memory Authentication যুক্ত করা যায়:
@Bean
public InMemoryUserDetailsManager userDetailsService() {
return new InMemoryUserDetailsManager(
User.withUsername("admin")
.password(passwordEncoder().encode("admin123"))
.roles("ADMIN")
.build(),
User.withUsername("user")
.password(passwordEncoder().encode("user123"))
.roles("USER")
.build()
);
}
HttpSecurity-এর গুরুত্বপূর্ণ বৈশিষ্ট্য
১. Authentication
Authentication নিশ্চিত করতে HttpSecurity ব্যবহার করা হয়।
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.formLogin()
.httpBasic();
২. Authorization
Authorization এর মাধ্যমে নির্ধারণ করা হয় কোন ব্যবহারকারী কী অ্যাক্সেস করতে পারবে।
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
);
৩. CSRF Protection
CSRF আক্রমণ প্রতিরোধ করতে HttpSecurity ডিফল্টভাবে সক্রিয় করে।
http.csrf().disable(); // Disable CSRF (not recommended for production)
৪. Custom Login Page
http.formLogin()
.loginPage("/custom-login")
.permitAll();
৫. Logout Configuration
http.logout()
.logoutUrl("/custom-logout")
.logoutSuccessUrl("/login?logout")
.permitAll();
WebSecurityConfigurerAdapter এবং HttpSecurity-এর তুলনা
| বৈশিষ্ট্য | WebSecurityConfigurerAdapter | HttpSecurity with SecurityFilterChain |
|---|---|---|
| স্থিতি | Deprecated in Spring Security 5.7 | Recommended for new applications |
| কাস্টমাইজেশন সহজতা | একক ক্লাসে সব কিছু ব্যবস্থাপনা | ক্লিনার এবং মডুলার কাঠামো |
| মডিউলারিটি | কম মডিউলার | অধিক মডিউলার |
| প্রযুক্তি সমর্থন | Spring Security এর পুরোনো সংস্করণ | Spring Security 5.7 এবং পরবর্তী সংস্করণ |
উপসংহার
Spring Security-তে HttpSecurity এবং WebSecurityConfigurerAdapter নিরাপত্তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে। WebSecurityConfigurerAdapter এখন ডিপ্রিকেটেড হওয়ায়, SecurityFilterChain এবং HttpSecurity ব্যবহার করার পরামর্শ দেওয়া হয়।
আপনার প্রয়োজন অনুযায়ী উদাহরণ বা সাহায্য চাইলে জানাতে পারেন!
Read more